#include "array.h"

/**
 * @brief 可变数组创建函数
 * @param int_size 数组初始长度
 * @return 可变数组的头指针
 */
Array arr_create(int init_size)
{
    Array a;
    a.size = init_size;
    a.array = (int*)malloc(sizeof(int) * init_size);

    return a;
    /**为什么不返回指针? 因为a是个本地变量, */
    
}

/**
 * @brief 释放数组
 */
void arr_free(Array *arr)
{
    free(arr->array);
    arr->array = NULL;//防止array被二次释放
    arr->size = 0;
}

/**
 * @return 数组大小
 */
int arr_size(const Array *arr)
{
    return arr->size;
}

/**
 * @brief 索引数组元素,若索引越界,则扩展数组
 * @return 索引元素的地址. 为什么返回地址? 因为可以通过地址修改元素, 
 *         但不够优雅,可以再封装一个get函数和set函数.
 */
int* arr_at(Array *arr, int index)
{
    if (index >= arr->size){
        arr_inflate(arr, (index/BLOCK_SIZE + 1) * BLOCK_SIZE  - arr->size);
    }
    return &(arr->array[index]);
}

int arr_get(const Array *arr, int index)
{
    return arr->array[index];
}

void arr_set(Array *arr, int index, int value)
{
    arr->array[index] = value;
}

void arr_inflate(Array *arr, int more_size)
{
    int *p = (int*)malloc(sizeof(int) * (arr->size + more_size));
    memcpy(p, arr->array, sizeof(int) * arr->size);
    free(arr->array);
    arr->array = p;
    arr->size += more_size;
}

void arr_display(const Array *arr)
{
    for (int i = 0; i < arr->size; i++){
        printf("%d ", arr->array[i]);
    }
    printf("\n数组大小:%d\n", arr->size);
}